home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gigantic Games 2
/
Gigantic Games 2.iso
/
pc
/
_a_
/
abitur
/
txt
/
fragen.mod
< prev
next >
Wrap
Text File
|
1994-12-23
|
7KB
|
251 lines
IMPLEMENTATION MODULE Fragen;
FROM FaecherNamen IMPORT FaecherNamen, FaecherTypen;
FROM LineReader IMPORT ReadALine;
FROM SYSTEM IMPORT ADR;
FROM Exec IMPORT AllocMem, FreeMem, MemReqs, MemReqSet;
FROM Arts IMPORT BreakPoint, Assert, TermProcedure;
FROM Dos IMPORT Open, Close, oldFile, FileHandlePtr;
FROM Str IMPORT Copy, Concat, Length;
FROM Strings IMPORT Compare;
FROM RandomNumber IMPORT RND;
PROCEDURE ScanAnAntEle(VAR Str: ARRAY OF CHAR; VAR Pos:INTEGER): FAntwortPtr;
VAR TempAntEle: FAntwortPtr;
IPos : INTEGER;
BEGIN
WHILE (Str[Pos] # "(") AND (Str[Pos] # '"') DO
IF Str[Pos] = 0C THEN
RETURN NIL
END;
INC(Pos)
END;
TempAntEle := AllocMem(SIZE(FAntwort), MemReqSet{public});
Assert(TempAntEle#NIL, ADR("Not enough mem"));
IF Str[Pos] = '"' THEN
TempAntEle^.IsText := TRUE;
INC(Pos); IPos := 0;
WHILE (Str[Pos] # '"') AND (Str[Pos] # 0C) DO
TempAntEle^.Str[IPos] := Str[Pos];
INC(Pos); INC(IPos)
END;
TempAntEle^.Str[IPos] := 0C;
IF Str[Pos] = '"' THEN INC(Pos) END
ELSIF Str[Pos] = "(" THEN
TempAntEle^.IsText := FALSE;
TempAntEle^.Mul := {};
INC(Pos);
WHILE (Str[Pos] # ")") AND (Str[Pos] # 0C) DO
CASE CAP(Str[Pos]) OF
"A": INCL(TempAntEle^.Mul, 0)
|"B": INCL(TempAntEle^.Mul, 1)
|"C": INCL(TempAntEle^.Mul, 2)
|"D": INCL(TempAntEle^.Mul, 3)
|"E": INCL(TempAntEle^.Mul, 4)
|"F": INCL(TempAntEle^.Mul, 5)
ELSE
END;
INC(Pos)
END
END;
RETURN TempAntEle
END ScanAnAntEle;
PROCEDURE GetOneFrage(F: FileHandlePtr): FragePtr;
VAR AFrage: FragePtr;
TempString: ARRAY[0..511] OF CHAR;
EOFile: BOOLEAN;
Zeile: INTEGER;
i: INTEGER;
pos: INTEGER;
Nummer: INTEGER;
ScanPos: INTEGER;
AntEle: FAntwortPtr;
BEGIN
AFrage := AllocMem(SIZE(Frage), MemReqSet{public});
Assert(AFrage#NIL, ADR("Nicht genug Speicher"));
AFrage^.Next := NIL;
FOR i := 0 TO 10 DO AFrage^.Txt[i][0] := 0C END;
FOR i := 1 TO 6 DO AFrage^.MultipleAntw[i][0] := 0C END;
FOR i := 1 TO 6 DO AFrage^.Auswert[i] := NIL END;
Zeile := 0; (* Nächste StringZeile in AFrage.Txt hier *)
REPEAT
ReadALine(F, TempString, EOFile);
IF (TempString[0] = '"') THEN
pos := 0;
REPEAT
INC(pos);
AFrage^.Txt[Zeile][pos-1] := TempString[pos]
UNTIL TempString[pos] = 0C;
INC(Zeile)
END
UNTIL EOFile OR (TempString[0] # '"');
(* Die Gelesene Zeile bleibt in TempString *)
IF Zeile = 0 THEN (* Keine Frage gelesen: *)
FreeMem(AFrage, SIZE(Frage));
RETURN NIL
END;
REPEAT (* Habe bereits eine Zeile gelesen *)
IF NOT EOFile AND (TempString[0] # "1") THEN
TempString[0] := CAP(TempString[0]);
(* Multiple Antwort Lesen *)
IF (TempString[0] >= "A") AND (TempString[0] <= "F") THEN
Nummer := ORD(TempString[0]) - ORD("A") + 1;
IF TempString[1] = " " THEN
ScanPos := 2
ELSE
ScanPos := 1
END;
pos := 0; (* Wohin sollen die Zeichen *)
REPEAT
AFrage^.MultipleAntw[Nummer][pos] := TempString[ScanPos];
INC(pos); INC(ScanPos)
UNTIL TempString[ScanPos-1] = 0C
END; (* Multiple Eintrag *)
(* Notengebung Auswertung einscannen *)
IF (TempString[0] >= "1") AND (TempString[0] <= "6") THEN
Nummer := ORD(TempString[0]) - ORD("1") + 1;
ScanPos := 1;
AFrage^.Auswert[Nummer] := NIL;
REPEAT
AntEle := ScanAnAntEle(TempString, ScanPos);
IF AntEle # NIL THEN
AntEle^.Next := AFrage^.Auswert[Nummer];
AFrage^.Auswert[Nummer] := AntEle
END
UNTIL AntEle = NIL;
END
END;
ReadALine(F, TempString, EOFile);
UNTIL EOFile OR (TempString[0] = "1") ;
RETURN AFrage
END GetOneFrage;
PROCEDURE GetDskFrage(F: FaecherTypen);
VAR AktFrage: FragePtr;
FFile: FileHandlePtr;
FName: ARRAY[0..255] OF CHAR;
BEGIN
Copy(FName, "Fragen/");
Concat(FName, FaecherNamen[F].VollName);
FFile := Open(ADR(FName), oldFile);
AnzaFragen[F] := 0;
AlleFragen[F] := NIL;
IF FFile # NIL THEN
REPEAT
AktFrage := GetOneFrage(FFile);
IF AktFrage # NIL THEN
INC(AnzaFragen[F]);
AktFrage^.Next := AlleFragen[F];
AlleFragen[F] := AktFrage
END
UNTIL AktFrage = NIL;
Close(FFile)
END
END GetDskFrage;
PROCEDURE Bewerte(F: FragePtr; VAR S: SchuelerAntwort): REAL;
(* Gibt von Frage F und SchuelerAntwort S die Note zurück *)
(* Note von 1.0 2.0 3.0 .. 6.0 *)
VAR Note : REAL;
i: INTEGER;
Aptr : FAntwortPtr;
BEGIN
Note := 6.0;
i := 6;
LOOP
Aptr := F^.Auswert[i];
WHILE Aptr # NIL DO
(* BreakPoint(ADR("InFragenBewert")); *)
IF Aptr^.IsText THEN
IF Compare(S.Str, 0, Length(S.Str), Aptr^.Str, FALSE) = 0 THEN
RETURN Note
END
ELSE (* Ist multiple Antwort *)
IF S.Mul = Aptr^.Mul THEN
RETURN Note
END
END;
Aptr := Aptr^.Next
END;
Note := Note - 1.0;
DEC(i);
IF i = 1 THEN RETURN 1.0 END
END
END Bewerte;
PROCEDURE SearchRNDFrage(Fach: FaecherTypen): FragePtr;
(* Sucht in der Liste Allefragen nach dem Fach und eine Beliebige Frage.
* gibt NIL zurück, wenn keine Frage vorhanden ist.
*)
VAR F: FragePtr;
Nummer, i: INTEGER;
BEGIN
IF AnzaFragen[Fach] <= 0 THEN RETURN NIL END;
Nummer := RND(AnzaFragen[Fach]); (* 0..Anzahl-1 *)
F := AlleFragen[Fach];
IF Nummer > 0 THEN
FOR i := 1 TO Nummer DO
F := F^.Next
END
END;
RETURN F
END SearchRNDFrage;
PROCEDURE FreeFants(F: FAntwortPtr);
VAR Temp: FAntwortPtr;
BEGIN
WHILE F # NIL DO
Temp := F;
F := F^.Next;
FreeMem(Temp, SIZE(FAntwort))
END
END FreeFants;
PROCEDURE FreeAllFragen;
VAR F: FaecherTypen;
Tmp: FragePtr;
i: INTEGER;
BEGIN
FOR F := Turnen TO Informatik DO
WHILE AlleFragen[F] # NIL DO
FOR i := 1 TO 6 DO
FreeFants(AlleFragen[F]^.Auswert[i])
END;
Tmp := AlleFragen[F];
AlleFragen[F] := AlleFragen[F]^.Next;
FreeMem(Tmp, SIZE(Frage))
END
END;
(* BreakPoint(ADR("Free alle Fragen")); *)
END FreeAllFragen;
VAR Fach: FaecherTypen;
BEGIN
FOR Fach := Turnen TO Informatik DO
GetDskFrage(Fach);
END;
TermProcedure(FreeAllFragen);
(* BreakPoint(ADR("AlleFragen eingelesen")); *)
END Fragen.